package cn.sail.spring.aop.proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.CodeSignature;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Aspect
@Component
public class AnnotationAuthorityAdvice {
    /**
     * 告诉spring aop 切面
     * 1，哪些类和方法是需要进行增强（切点）
     * 2，在方法得哪个位置进行增强（连接点）
     * 3，连接点对应的增强的方法指定
     */
    @Pointcut("execution(* cn.sail.spring.aop.service.impl.UserServiceImpl.add(..))")
    public void addPointcut(){}

    @Pointcut("execution(* cn.sail.spring.aop.service.impl.UserServiceImpl.find(..))")
    public void findPointcut(){}

//    //方法执行之前开启事务，打印日志
//    @Before("cn.sail.spring.aop.proxy.AnnotationAuthorityAdvice.pointcut()")
//    public void before(){
//        System.out.println("log start");
//        System.out.println("开启事务");
//    }
//    @AfterReturning("cn.sail.spring.aop.proxy.AnnotationAuthorityAdvice.pointcut()")
//    //方法正常执行之后提交事务
//    public void afterReturning(){
//        System.out.println("提交事务");
//    }
//    @AfterThrowing("cn.sail.spring.aop.proxy.AnnotationAuthorityAdvice.pointcut()")
//    //方法异常执行之后回滚事务
//    public void afterThrowing(){
//        System.out.println("事务回滚");
//    }
//    @After("cn.sail.spring.aop.proxy.AnnotationAuthorityAdvice.pointcut()")
//    //方法执行完之后
//    public void after(){
//        System.out.println("log end");
//    }
    //添加用户环绕通知
    @Around("AnnotationAuthorityAdvice.addPointcut()")
    public Object addUserAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("添加用户环绕通知之前");
        Object[] paramValues = joinPoint.getArgs();
        int i = (int) paramValues[0];
        if(i <2){
            System.out.println("没有该权限");
            return null;
        }
        System.out.println("权限通过");
        //调用目标对象方法
        Object result = joinPoint.proceed();
        return result;
    }

    //添加用户环绕通知
    @Around("AnnotationAuthorityAdvice.findPointcut()")
    public Object findUserAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("查找用户环绕通知之前");
        Object[] paramValues = joinPoint.getArgs();
        int i = (int) paramValues[0];
        if(i <1){
            System.out.println("没有该权限");
            return null;
        }
        System.out.println("权限通过");
        //调用目标对象方法
        Object result = joinPoint.proceed();
        return result;
    }

}
